#define rectLength vec3(.5)
#define TMIN 0.02
#define TMAX 40.
#define RAYMARCH_TIME 228
#define TSTEP RAYMARCH_TIME
#define PRECISION .001
#define _RectPos vec3(0., 0., 0.)
#define _RectLength vec3(.8, 1., .6)
vec2 fixUV(in vec2 uv) {
    // 将从0-1902的像素uv值，转换为 0~1的uv值。
    return (2. * uv - iResolution.xy ) / min(iResolution.xx, iResolution.yy);
}

bool IsOutRect(vec3 ro)
{
    vec3 p = ro - _RectPos.xyz;
    float bottom = -_RectLength.y;
    float top = _RectLength.y;
    float widthLeft = abs(_RectLength.x);
    float widthRight = abs(_RectLength.z);

    if (bottom > p.y || p.y > top
        || -widthRight > p.x || p.x > widthRight
        || -widthLeft > p.z || p.z > widthLeft)
    {
        return false;
    }
    return true;
}

vec4 rayMarch(vec3 ro, vec3 rd)
{
    float t = TMIN;
    vec4 colorSum = vec4(0., 0., 0., 0.);

    for (int i = 0; i < TSTEP; i++)
    {
        vec3 p = ro + t * rd;
        t += TMIN;
        if (IsOutRect(p))
        {
           // if(t > _TMAX) return colorSum; 
            // 累积颜色
            float density = 0.01;
            vec4 color = vec4(0.9, 0., 0., 1.0) * density; // 当前点的颜色
            colorSum = colorSum + color * (1. - colorSum.a); // 与累积的颜色混合
        }
        
    }
    return colorSum;
}

// #define f sdfRect
// vec3 calcNormal( in vec3  p) // for function f(p)
// {
//     const float h = 0.0001; // replace by an appropriate value
//     const vec2 k = vec2(1,-1);
//     return normalize( k.xyy*f( p + k.xyy*h ) + 
//                       k.yyx*f( p + k.yyx*h ) + 
//                       k.yxy*f( p + k.yxy*h ) + 
//                       k.xxx*f( p + k.xxx*h ) );
// }

mat3 setCamera(vec3 ta, vec3 ro, float cr) { // 动态计算相机位置，让相机可以旋转，方便调试
    vec3 z = normalize(ta - ro);
    vec3 cp = vec3(sin(cr), cos(cr), 0.);
    vec3 x = normalize(cross(z, cp));
    vec3 y = cross(x, z);
    return mat3(x, y, z);
}

vec3 calcLight(vec3 p, vec3 normal) {
    vec3 color = vec3(1.);

    // vec3 lightWS = vec3(1., 2., 0.);
    vec3 lightWS = vec3(2., 2.,  1.);
    vec3 lightDir = normalize(lightWS - p);

    float LdotN = dot(lightDir, normal);
    LdotN = clamp(LdotN, 0., 1.);
    float lambert = LdotN;
    

    vec3 amb = (.5 + .5 * dot(normal, vec3(0., 1., 0.)) ) * vec3(.25);
    color = color * lambert + amb;

    return color;
}

#define PI 3.1415926
vec4 render(vec2 uv) {
    vec3 ro = vec3(0., 0., -1.5); // 起点位置，摄像机位置
    ro = vec3(2. * cos(iTime), 1. * cos(iTime * .5) + 2., 2. * sin(iTime)); // 旋转摄像头，方便观察
    if(iMouse.z > 0.01) { // 鼠标输入控制摄像头
        float theta = iMouse.x / iResolution.x * 2. * PI;
        ro = vec3(2. * cos(theta), 2., 2. * sin(theta));
    }
    vec3 ta = vec3(0.);
    mat3 cam = setCamera(ta, ro, 0.);

    vec3 rd = normalize(vec3(uv, 0.) - ro); // 相机到 各个屏幕像素的方向
    rd = normalize(cam * vec3(uv, 1.));


    vec4 color = vec4(0.);
    vec4 t = rayMarch(ro, rd);
    color = t;

    // if(t < TMAX) {
    //     vec3 p = ro + t * rd; // 当前点位置，世界坐标
    //     vec3 normal = calcNormal(p);

    //     color = vec3(1., 1., 1.);
    //     color = calcLight(p, normal) * color;
    // }

    return color;
}

vec4 renderAA(in vec2 fragCoord) { // 4次采样，进行平滑反锯齿
    int AATime = 4;

    vec4 color = vec4(0.);

    color += render(fixUV(fragCoord + vec2(0, 0)));
    // color += render(fixUV(fragCoord + vec2(0, 1)));
    // color += render(fixUV(fragCoord + vec2(1, 0)));
    // color += render(fixUV(fragCoord + vec2(0, -1)));
    // color += render(fixUV(fragCoord + vec2(-1, 0)));

    // return color / (float(AATime) + 1.);
    return color;
}


void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec2 uv = fixUV(fragCoord);

    vec4 col = render(uv);
    col = renderAA(fragCoord);

    fragColor = col;
}